2024不可不会的StableDiffusion之拼接各组件(五)

news2024/11/22 16:36:21

1. 引言

在之前的文章中,我介绍了如何安装扩散器库diffuser用以生成 AI 图像和构成stable diffusion的各个关键组件,即 CLIP 文本编码器、VAE U-Net。在这篇文章中,我们将尝试把这些关键组件放在一起,并详细展示生成图像的扩散过程。

闲话少说,我们直接开始吧!

2. 概述

稳定扩散模型(Stable diffusion)采用文本输入和种子作为相关输入。然后,文本输入通过 CLIP 模型生成大小为77x768的文本嵌入(embedding),种子用于生成大小为 4x64x64 的高斯噪声,并将其作为第一个潜在图像表示。

在这里插入图片描述

接下来,U-Net迭代地对随机的潜在图像表示进行去噪。U-Net的输出是预测噪声,然后通过scheduler 调度器算法用于计算潜在的latents。这种去噪和基于文本的调节的过程重复 N 次(我们将使用 50 次)以便来获取更好的潜在图像表示。此过程完成后,VAE 解码器将对潜在图像表示 (4x64x64) 进行解码,用以解码生成最终的图像 (3x512x512)

这种迭代去噪是获得良好输出图像的重要步骤。典型步骤操作数在 30-80 的范围内。然而,最近有论文声称通过使用蒸馏技术可以将其减少到4-5个操作步骤。

3. 辅助函数

接下来我们开始代码实践,本节涉及的大部分函数和所需的依赖库都已在本系列的前第三篇文章中进行了相关使用和解释。
这里我们额外添加以下两个辅助函数:

## Helper functions
def load_image(p):
    '''
    Function to load images from a defined path
    '''
    return Image.open(p).convert('RGB').resize((512,512))
    
## text encoder
def text_enc(prompts,text_encoder,maxlen=None,tokenizer=None,):
    if maxlen is None:
        maxlen = tokenizer.model_max_length
    inp = tokenizer(prompts,padding="max_length",
                    max_length=maxlen,truncation=True,
                    return_tensors="pt")
    return text_encoder(inp.input_ids.to("cuda"))[0].half()

第一个函数用来读取图像,并将其缩放至512X512的分辨率;第二个函数主要用于将输入的文本转化成文本嵌入embeding

4. 核心函数

接下来,我们来定义函数prompt2img,用以实现 StableDiffusionPipeline.from_pretrained 函数相关功能的精简版本。

相关代码定义如下:

def prompt2img(prompts,text_encoder,tokenizer, unet, vae, scheduler,
               g=7.5, seed=100,steps=70,dim=512,save_int=False):
    bs = len(prompts)
    # convert textual prompts to embeding
    text = text_enc(prompts,text_encoder,
                    maxlen=tokenizer.model_max_length,
                    tokenizer=tokenizer)
    # adding an unconditional prompt
    uncond = text_enc( [""] * bs, text_encoder,
                      maxlen=text.shape[1] ,tokenizer=tokenizer)
    emb = torch.cat([uncond,text])
    if seed:
        torch.manual_seed(seed)

    # init random noise
    latents = torch.randn((bs,unet.in_channels,dim//8,dim//8))
    # set number of setps in scheduler
    scheduler.set_timesteps(steps)
    # add noise to the latents
    latents = latents.to("cuda").half()*scheduler.init_noise_sigma
    # iter through defined steps
    for i ,ts in enumerate(tqdm(scheduler.timesteps)):
        # we need to scale the i/p latents to match the variance
        inp = scheduler.scale_model_input(torch.cat([latents] * 2),ts)
        # predicting noise residual using UNet
        with torch.no_grad():
            u,t = unet(inp,ts,encoder_hidden_states=emb).sample.chunk(2)
        # performing Guidance
        pred = u + g* (t-u)
        # Conditioning the latents
        latents = scheduler.step(pred,ts,latents).prev_sample

        if save_int:
            os.makedirs(f"./steps",exist_ok=True)
            latent_to_pil(latents,vae)[0].save(f'steps/{i:04}.jpeg')

    return latent_to_pil(latents,vae)

5. 效果验证

我们接下来,测试上述函数的功能,即给定文本输入prompt,生成对应的图像,代码如下:

images = prompt_2_img(["A dog wearing a hat", "a photograph of an astronaut riding a horse"], save_int=False)
for img in images:
    plt.imshow(img)
    plt.show()

得到结果如下:

在这里插入图片描述

6. 代码讲解

可以看到,我们使用函数prompt2img实现了之前调用Stable Diffusion PipeLine类似的功能,即基于文本生成图像的功能。
接下来,我们来对函数prompt2img函数相关参数进行详细的讲解。

prompt: 该参数是我们通过文本提示生成图像的提示词。类似于我们在第 1 部分中看到的pipe函数的prompt参数
text_encoder: 该参数表示需要调用的文本编码器
tokenizer:该参数表示用以将文本转为token的tokenizer
unet: 表示基于unet的预测噪声的扩散模型
vae:该参数表示SD中第二个组件变分自编码器
scheduler: 该参数表示扩散过程控制每步添加噪声的权重
g:代表guidance scale该值用于确定图像与文本提示的接近程度。这与一种称为“ Classifier free guidance”的技术有关,该技术可提高生成图像的质量。guidance scale的值越高,生成的图像就越接近文本提示
seed :该值决定了生成初始高斯latents的种子
steps: 该值决定了生成最终latents所需要的去噪步数
dim: 图像的尺寸,为简单起见,我们目前正在生成方形图像,因此只需要一个值,即可表示生成图像的长和宽
save_int :这是可选的bool变量,如果我们想保存中间潜在生成图像,则将其设置为True

7. 中间过程可视化

为了可视化扩散模型的中间过程,我们将参数save_int设置为True,来将中间过程进行保存。

scheduler = LMSDiscreteScheduler(beta_start=0.00085, beta_end=0.012, 
                                 beta_schedule="scaled_linear",
                                  num_train_timesteps=1000)
scheduler.set_timesteps(50)
prompts = ["A dog wearing a hat"]
images = prompt2img(prompts, text_encoder, tokenizer, unet, vae, scheduler, save_int=True)

并使用ffmpeg将每一个step得到的图像合并成视频进行输出:

ffmpeg -v 1 -y -f image2 -framerate 20 -i steps/%04d.jpeg -c:v libx264 -preset slow -qp 18 -pix_fmt yuv420p out.mp4

得到最终结果如下:

在这里插入图片描述

8. 总结

我希望这能给大家提供一个很好的概述,并将代码分解到最低限度,以便我们能够理解每个组件。现在我们已经实现了基于三个组件来实现SD文本生图的功能,并给出了详细的代码示例。

您学废了嘛?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1425157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在Shopee菲律宾市场进行选品:策略和建议

在Shopee菲律宾市场进行选品时,卖家需要采取一系列策略和建议,以确保他们的产品能够在这个市场上取得成功。这篇文章将介绍一些关键的策略和建议,帮助卖家更好地了解市场趋势、关注热销品类、满足消费者需求、创新营销手段、优化供应链管理、…

大数据分析|从七个特征理解大数据分析

文献来源:Saggi M K, Jain S. A survey towards an integration of big data analytics to big insights for value-creation[J]. Information Processing & Management, 2018, 54(5): 758-790. 下载链接:链接:https://pan.baidu.com/s/1…

如何进行有效的Shopee新店选品

在Shopee平台上开设新店是一个令人兴奋的时刻,但是在开始销售之前,进行有效的选品是至关重要的一步。选品的质量和策略将直接影响你的市场竞争力和销售业绩。下面是一些建议,可以帮助你进行有效的Shopee新店选品。 先给大家推荐一款shopee知虾…

❤ 做一个自己的AI智能机器人吧

❤ 做一个自己的AI智能机器人 看了扣子(coze)的模型,字节基于chatgpt搭建的一个辅助生成AI的网站,感觉蛮有意思,看了掘金以后,于是动手自己也实现了一个。 官网 https://www.coze.cn/ 进入的网站 1、 创…

算法模板 1.前缀和

前缀和&#xff1a;以O(1)的时间求解一段区间的和&#xff0c;空间复杂度O(n) 一维前缀和 795. 前缀和 - AcWing题库 #include <bits/stdc.h> using namespace std; const int N 100010; int a[N],s[N]; int main(){int n,m;scanf("%d%d",&n,&m);fo…

跟着cherno手搓游戏引擎【15】DrawCall的封装

目标&#xff1a; Application.cpp:把渲染循环里的glad代码封装成自己的类&#xff1a; #include"ytpch.h" #include "Application.h"#include"Log.h" #include "YOTO/Renderer/Renderer.h" #include"Input.h"namespace YO…

个人建站前端篇(二)项目采用服务端渲染SSR

SSR的优点 更好的SEO首屏加载速度更快&#xff0c;用户体验更好可以使用相同的语言以及相同的声明式、面向组件的心智模型来开发整个应用&#xff0c;而不需要在后端模板系统和前端框架之间来回切换。 Vue生态中的SSR通用解决方案 Nuxt是一个构建于 Vue 生态系统之上的全栈框…

Modelarts自动学习之旅,实现智慧食堂的人脸识别提示优化

前言 最近公司食堂进行了升级&#xff0c;不但餐盘更换为智能餐盘&#xff0c;且结账的时候可以刷脸支付。 这些升级让排队结账的速度提升了很多&#xff0c;且食堂员工效率也随之提高了很多。果然&#xff0c;科技改变世界。 我观察了一下&#xff0c;智能餐盘基本没有卡顿…

最新2024如何解决谷歌浏览器Chrome谷歌翻译无法使用问题

快速恢复谷歌浏览器一键翻译功能在Chrome 中安装好【翻译】插件 Macbook 操作步骤&#xff1a; 1点击“前往”&#xff0c;打开“前往文件夹” 2 在对话框中输入“/etc” 囝找到“hosts”文件&#xff0c;复制粘贴到桌面 3 在复制的文件最后新起一行&#xff0c;输入并保存&am…

UnityShader(十二)实现标准光照模型中的高光反射

目录 基本光照模型中的高光反射公式&#xff1a; 逐顶点光照 逐像素光照 基本光照模型中的高光反射公式&#xff1a; 从公式可以看出 要计算高光反射需要知道四个参数&#xff1a;入射光线的颜色和强度clight&#xff0c;材质的高光反射系数mspecular&#xff0c;视角方向v以…

怿星科技荣膺星河智联“2023年度卓越供应商”,共创智能座舱新未来

1月19日&#xff0c;在星河智联2023年度卓越供应商评选活动中&#xff0c;怿星科技凭借卓越的产品和优质的服务&#xff0c;以及在项目管理、设计开发和成本控制等多方面的出色表现&#xff0c;荣获了“年度卓越供应商”的荣誉称号。 添加图片注释&#xff0c;不超过 140 字&am…

UML/SysML建模工具更新情况(截至2024年1月)(2)Papyrus 6.6.0

工具最新版本&#xff1a;drawio-desktop 23.0.2 更新时间&#xff1a;2024年1月25日 工具简介 开源绘图工具&#xff0c;用Electron编写&#xff0c;跨平台&#xff0c;支持UML。桌面版和在线版现在版本号已统一。在线版&#xff1a;Flowchart Maker & Online Diagram S…

oracle数据库慢查询SQL

目录 场景&#xff1a; 环境&#xff1a; 慢SQL查询一&#xff1a; 问题一&#xff1a;办件列表查询慢 分析&#xff1a; 解决方法&#xff1a; 问题二&#xff1a;系统性卡顿 分析&#xff1a; 解决方法&#xff1a; 慢SQL查询二 扩展&#xff1a; 场景&#xff1a; 线…

Uniapp登录页面获取头像、昵称的最新方法的简单使用

前言 写小程序写到登录页面的时候&#xff0c;发现官方文档中原来的wx.getUserInfo和wx.getUserProfile不太能用了&#xff0c;学习了相对比较新的方法&#xff0c;这种方法的文档链接如下&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/framework/open-abil…

免费的ChatGPT网站 ( 7个 )

ChatGPT的核心功能是基于用户在输入时的语言或文本生成相应的回复或继续内容。此外&#xff0c;它还能够完成多种任务&#xff0c;如撰写邮件、视频脚本、文案、翻译、代码编写以及撰写论文等。 博主归纳总结了7个国内非常好用&#xff0c;而且免费的chatGPT网站&#xff0c;AI…

Camunda ScriptTask SendTask ReceiveTask操作

文章目录 开始脚本任务(ScriptTask)发送任务(SendTask)接收任务(ReceiveTask)流程图xml 开始 前面我们已经介绍了Camunda最基本的操作和常见的监听器&#xff0c;如果不熟悉Camunda&#xff0c;可以先看一下&#xff0c;方便搭建环境&#xff0c;亲手测试。 Camunda组件与服务…

轻量式RPC调用日志链路设计方案

导语: 调用链跟踪系统,又称为tracing&#xff0c;是微服务设计架构中&#xff0c;从系统层面对整体的monitoring和profiling的一种技术手 背景说明 由于我们的项目是微服务方向&#xff0c;中后台服务调用链路过深&#xff0c;追踪路径过长&#xff0c;其中某个服务报错或者异…

YOLOv5改进芒果首发:24年最新论文Shift-ConvNets:稀疏/移位操作让小卷积核也能达到大卷积核效果,来打造新颖YOLOv5检测器

💡本篇内容:YOLOv5改进芒果首发:24年最新论文Shift-ConvNets:稀疏/移位操作让小卷积核也能达到大卷积核效果,来打造新颖YOLOv5检测器 💡附改进源代码及教程,用来改进作为 🚀改进Shift-ConvNets 深圳大学出品!!24年最新论文 Shift-ConvNets地址:https://arxiv.o…

c/c++串的链式操作

文章目录 1.链式串的定义2.初始化3.赋值为04.赋值操作5.打印操作6.源码 本篇博客中都是带头结点的串。 1.链式串的定义 这里的数据域是4个字节&#xff0c;是为了节省空间。 typedef struct StringNode{char ch[4]; //按串长分配存储区&#xff0c;ch指向串的基地址struct S…

史诗级详细离线更新centos系统的openssh,升级到9.3p1!!

离线更新openssh步骤 文章目录 前言一、openssh是什么?二、更新步骤 1.查看相关组件版本是否存在(代码包已全部打包)2.进行openssh离线更新总结(安装时可能出现的问题等)前言 对于可能很多人在离线更新openssh时都没找到一篇能解决实际问题的文章,那么今天它来了,请往下看…