stable diffusion代码学习笔记

这篇具有很好参考价值的文章主要介绍了stable diffusion代码学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:本文没有太多公式推理,只有一些简单的公式,以及公式和代码的对应关系。本文仅做个人学习笔记,如有理解错误的地方,请指出。

本文包含stable diffusion入门文献和不同版本的代码。

文献资源

  1. 本文学习的代码;
  2. 相关文献:
  • Denoising Diffusion Probabilistic Models : DDPM,这个是必看的,推推公式
  • Denoising Diffusion Implicit Models :DDIM,对 DDPM 的改进
  • Pseudo Numerical Methods for Diffusion Models on Manifolds :PNMD/PLMS,对 DDPM 的改进
  • High-Resolution Image Synthesis with Latent Diffusion Models :Latent-Diffusion,必看
  • Neural Discrete Representation Learning : VQVAE,简单翻了翻,示意图非常形象,很容易了解其做法

代码资源

  1. stable diffusion v1.1-v1.4, https://github.com/CompVis/stable-diffusion
  2. stable diffusion v1.5,https://github.com/runwayml/stable-diffusion
  3. stable diffusion v2,https://github.com/Stability-AI/stablediffusion
  4. stable diffusion XL,https://github.com/Stability-AI/generative-models

前向过程(训练)

  • 输入一张图片+随机噪声,训练unet,网络预测图片加上的噪声

反向过程(推理)

  • 给个随机噪声,不断迭代去噪,输出一张图片

总体流程

  • 输入的prompt经过clip encoder编码成(3+3,77,768)特征,正负prompt各3个,默认negative prompt为空‘’,解码时正的和负的latent图片用公式计算一下才是最终结果;time step通过linear层得到(3+3,1280)特征;把prompt和time ebedding和随机生成的图片放入unet,得到的就是我们要的图片。

采样流程 text2img

  • 该函数在PLMSSampler中,输入x(噪声,(3,4,64,64))-----c(输入的prompt,(3,77,768)----t (输入的time step,第几次去噪(3,)。把这三个东西输入unet,得到预测的噪声e_t。
 def p_sample_plms(self, x, c, t, index, repeat_noise=False, use_original_steps=False, quantize_denoised=False,
                      temperature=1., noise_dropout=0., score_corrector=None, corrector_kwargs=None,
                      unconditional_guidance_scale=1., unconditional_conditioning=None, old_eps=None, t_next=None):
        b, *_, device = *x.shape, x.device

        def get_model_output(x, t):
            if unconditional_conditioning is None or unconditional_guidance_scale == 1.:
                e_t = self.model.apply_model(x, t, c)
            else:
                x_in = torch.cat([x] * 2)
                t_in = torch.cat([t] * 2)
                c_in = torch.cat([unconditional_conditioning, c]) # 积极消极的prompt,解码时按照公式减去消极prompt的图像
                e_t_uncond, e_t = self.model.apply_model(x_in, t_in, c_in).chunk(2)
                e_t = e_t_uncond + unconditional_guidance_scale * (e_t - e_t_uncond)

            if score_corrector is not None:
                assert self.model.parameterization == "eps"
                e_t = score_corrector.modify_score(self.model, e_t, x, t, c, **corrector_kwargs)

            return e_t

        alphas = self.model.alphas_cumprod if use_original_steps else self.ddim_alphas
        alphas_prev = self.model.alphas_cumprod_prev if use_original_steps else self.ddim_alphas_prev
        sqrt_one_minus_alphas = self.model.sqrt_one_minus_alphas_cumprod if use_original_steps else self.ddim_sqrt_one_minus_alphas
        sigmas = self.model.ddim_sigmas_for_original_num_steps if use_original_steps else self.ddim_sigmas

        def get_x_prev_and_pred_x0(e_t, index):
            # select parameters corresponding to the currently considered timestep
            a_t = torch.full((b, 1, 1, 1), alphas[index], device=device)
            a_prev = torch.full((b, 1, 1, 1), alphas_prev[index], device=device)
            sigma_t = torch.full((b, 1, 1, 1), sigmas[index], device=device)
            sqrt_one_minus_at = torch.full((b, 1, 1, 1), sqrt_one_minus_alphas[index],device=device)

            # current prediction for x_0
            pred_x0 = (x - sqrt_one_minus_at * e_t) / a_t.sqrt()
            if quantize_denoised:
                pred_x0, _, *_ = self.model.first_stage_model.quantize(pred_x0)
            # direction pointing to x_t
            dir_xt = (1. - a_prev - sigma_t**2).sqrt() * e_t
            noise = sigma_t * noise_like(x.shape, device, repeat_noise) * temperature
            if noise_dropout > 0.:
                noise = torch.nn.functional.dropout(noise, p=noise_dropout)
            x_prev = a_prev.sqrt() * pred_x0 + dir_xt + noise
            return x_prev, pred_x0

        e_t = get_model_output(x, t) # 模型预测的噪声
        if len(old_eps) == 0:
            # Pseudo Improved Euler (2nd order)
            x_prev, pred_x0 = get_x_prev_and_pred_x0(e_t, index) # 输入噪声减去预测噪声得到新的噪声,当前预测的latent图片
            e_t_next = get_model_output(x_prev, t_next)
            e_t_prime = (e_t + e_t_next) / 2 # 两次噪声的均值?
        elif len(old_eps) == 1:
            # 2nd order Pseudo Linear Multistep (Adams-Bashforth)
            e_t_prime = (3 * e_t - old_eps[-1]) / 2
        elif len(old_eps) == 2:
            # 3nd order Pseudo Linear Multistep (Adams-Bashforth)
            e_t_prime = (23 * e_t - 16 * old_eps[-1] + 5 * old_eps[-2]) / 12
        elif len(old_eps) >= 3:
            # 4nd order Pseudo Linear Multistep (Adams-Bashforth)
            e_t_prime = (55 * e_t - 59 * old_eps[-1] + 37 * old_eps[-2] - 9 * old_eps[-3]) / 24

        x_prev, pred_x0 = get_x_prev_and_pred_x0(e_t_prime, index)

        return x_prev, pred_x0, e_t
  • 接下来看公式:
    stable diffusion代码学习笔记,aigc,stable diffusion,学习
  • 网络得到e_t后,进入到get_x_prev_and_pred_x0函数,可以看到pred_x0 = (x - sqrt_one_minus_at * e_t) / a_t.sqrt()就是上述公式,也就是说网络的预测结果通过公式计算,我们可以得到预测的pred_x0原始图片和前一刻的噪声图像x_prev
        def get_x_prev_and_pred_x0(e_t, index):
            # select parameters corresponding to the currently considered timestep
            a_t = torch.full((b, 1, 1, 1), alphas[index], device=device)
            a_prev = torch.full((b, 1, 1, 1), alphas_prev[index], device=device)
            sigma_t = torch.full((b, 1, 1, 1), sigmas[index], device=device)
            sqrt_one_minus_at = torch.full((b, 1, 1, 1), sqrt_one_minus_alphas[index],device=device)

            # current prediction for x_0
            pred_x0 = (x - sqrt_one_minus_at * e_t) / a_t.sqrt()
            if quantize_denoised:
                pred_x0, _, *_ = self.model.first_stage_model.quantize(pred_x0)
            # direction pointing to x_t
            dir_xt = (1. - a_prev - sigma_t**2).sqrt() * e_t
            noise = sigma_t * noise_like(x.shape, device, repeat_noise) * temperature
            if noise_dropout > 0.:
                noise = torch.nn.functional.dropout(noise, p=noise_dropout)
            x_prev = a_prev.sqrt() * pred_x0 + dir_xt + noise
            return x_prev, pred_x0
  • 前一刻的噪声图像的推理公式如图:
    stable diffusion代码学习笔记,aigc,stable diffusion,学习
    stable diffusion代码学习笔记,aigc,stable diffusion,学习

  • 得到了上一刻的噪声图片x_prev后(也就是函数返回的img),继续迭代,最终生成需要的图片。
    stable diffusion代码学习笔记,aigc,stable diffusion,学习

额外说明

这部分代码应该就是PLMS加速采样用的,论文中有公式推理
stable diffusion代码学习笔记,aigc,stable diffusion,学习
另外,还有一些参数是训练时候保存的,betas逐渐增大,用来控制噪声的强度。变量名解析 log_one_minus_alphas_cumprod其实就是log(1-alpha(右下角t)(头上直线)),没有带prev的都是当前时刻t,带prev的是前一时刻t-1。

stable diffusion代码学习笔记,aigc,stable diffusion,学习

参考文献:

https://blog.csdn.net/Eric_1993/article/details/129600524?spm=1001.2014.3001.5502
https://zhuanlan.zhihu.com/p/630354327文章来源地址https://www.toymoban.com/news/detail-783044.html

到了这里,关于stable diffusion代码学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【深度学习 AIGC】stable diffusion webUI 使用过程,参数设置,教程,使用方法

    如果你想使用docker快速启动这个项目,你可以按下面这么操作(显卡支持CUDA11.8)。如果你不懂docker,请参考别的教程。 模型文件即checkpoint已包含了与vae相关的参数。然而,稳定扩散官方和novelai泄露的文件都包含了额外的vae,用于改进面部或其他细节。因此,加载vae文件实

    2024年02月05日
    浏览(53)
  • Stable Diffusion学习笔记

    人工智能真是厉害。。。 我也不能落后 虽然前面pytorch还没有学完,但是热点总是在变的嘛,现在大模型和生成式AI这么火,我也来蹭蹭热度。 就从学习怎么用AIGC工具生成 老婆 纸片人开始吧 ❤ 2023.6.3 ❤ 首先找个教程,就在B站搜一下找播放量最高的学吧 好 决定就是你了

    2024年02月10日
    浏览(39)
  • 代码笔记:Generate lmages with Stable Diffusion

    目录 1、conda环境 2、使用过程中遇到的问题 (1)环境名称:ldm_py38 (2)pip -e git+https://github.com/CompVis/taming-transformers.git@master#egg=taming-transformers (以及pip -e git+https://github.com/openai/CLIP.git@main#egg=clip)报错:ERROR: Command errored out with exit status 128 报错原因:服务器的SSL证书没有经

    2024年02月10日
    浏览(37)
  • stable-diffusion 学习笔记

    万字长篇!超全Stable Diffusion AI绘画参数及原理详解 - 知乎 参考:stable diffusion提示词语法详解 参考:Ai 绘图日常 篇二:从效果看Stable Diffusion中的采样方法_软件应用_什么值得买 大概示例: 默认是Latent算法:注意该算法在二次元风格时重绘幅度必须必须高于0.5,否则会得到模

    2024年02月20日
    浏览(48)
  • 机器学习笔记:李宏毅 stable diffusion

     ①:文字变成向量  ②:喂入噪声+文字encoder,产生中间产物  ③:decoder 还原图片  这张图越往右下表示效果越好,可以看到text encoder尺寸越大,对后续生成图片的增益越多  现有一个训练好的CNN 模型,可以生成真实影像和生成图像的representation 这两组表征的分布越近,效

    2024年02月13日
    浏览(53)
  • 【学习笔记】文生图模型——Stable diffusion3.0

    2.0原理才看到VAE,sd3.0就发布了,虽然还没看到源码和详解,但原来的那个小方向估计得弃。人已经麻了。 1.LDMs模型(stable diffusion≈LDMs+CLIP)   2.stable diffusion3.0模型架构图 3.主要改进地方 ①前向加噪过程:引入了新的噪声采样器用于改善Rectified Flow训练,该方法优化了噪声

    2024年04月11日
    浏览(43)
  • 大模型学习笔记(一):部署ChatGLM模型以及stable-diffusion模型

    平台注册链接: https://growthdata.virtaicloud.com/t/SA 注册完成后,点击右上角: 费用中心 ,可查看领取的算力。 https://platform.virtaicloud.com/ ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的新一代对话预训练模型。 推理速度比上一代提高了很多,虽然本教程有两种启动方式,但教

    2024年03月19日
    浏览(63)
  • AIGC-stable-diffusion系列1- stable-diffusion-webui

    repo参考地址:https://github.com/AUTOMATIC1111/stable-diffusion-webui python下载地址:https://www.python.org/downloads/release/python-3106/ git下载地址:https://git-scm.com/download/win https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki 1 2 运行后会根据系统的默认python环境,创建虚拟环境 浏览器打开以下网址

    2024年02月16日
    浏览(52)
  • 【AIGC】 快速体验Stable Diffusion

    stable Diffusion是一款高性能的AI绘画生成工具,相比之前的AI绘画工具,它生成的图像质量更高、运行速度更快,是AI图像生成领域的里程碑。 推荐阅读:Stable diffusion干货-运作机制 纵观全网,目前找到的最简单的安装方法: 三分钟完成Stable Diffusion本地安装 安装好后,打开

    2024年02月12日
    浏览(51)
  • (二)AIGC—Stable Diffusion(2)

    越往后,加的噪声越多,逐渐递增 正常的话,类似RNN,前向传递,不利于模型训练。 如果直接从x0到xt最好,DPPM这篇论文就实现了这一目标 beta这一参数在扩散过程是已知的,前期设计好,从0.0001-0.002,线性衰减,,或者其他衰减,因此,beta1…beta_n肯定是已知的。 前向加噪

    2024年02月09日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包